#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import logging
print('\n\n#=======================IO操作==================')

#打开文件，如果文件不存在，则返回None
def open_file(path, mode, encoding):
    f = None
    try:
        f = open(path, mode, encoding= encoding)
        #print(f.read())
    except BaseException as e:   #BaseException是所有错误的基类，捕捉这个，捕捉范围类似Java
        print('except:', e)
        print('\n----------------------错误信息')
        logging.exception(e)
        print('----------------------\n')
    finally:
        if f:
            return f
        else:
            return None
        #if f:
            #f.close()

#获取文件中所有内容，返回字符串
def get_content_from_file(path, encoding = 'utf-8'):
    f = None
    try:
        f = open_file(path, 'r', encoding)
        if f:
            return f.read()
        else:
            return None
    finally:
        if f:
            f.close()

def put_content_to_file(path, content, encoding = 'utf-8'):
    f = open(path, 'w', encoding=encoding)
    f.write(content)  #.encode('utf-8').decode('utf-8')
    f.close()

def append_content_to_file(path, content, encoding = 'utf-8'):
    f = open(path, 'a', encoding=encoding)
    f.write(content)  #.encode('utf-8').decode('utf-8')
    f.close()



def test():
    s = get_content_from_file('J:/C.java', 'utf-8')
    if s == None:
        print('打开或者读文件时，出错了')
    else:
        print(s)


print('\n#======================读文件：python原生读文件方式')
with open('J:/aa.txt', 'r', encoding='utf-8') as f:   #open方法还可以接受第四个参数：errors='ignore' 表示忽略decode error
     print(f.read())

print('\n#======================读文件：python原生读文件方式---逐行读')
with open('J:/aa.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        print(line.strip()) # 把末尾的'\n'删掉

print('\n#======================读文件：我封装的方式')
s = get_content_from_file('J:/C.java', 'utf-8')
if s == None:
    print('打开或者读文件时，出错了')
else:
    print(s)

print('\n#======================读文件：codec方式')
import codecs, sys
#  用codecs提供的open方法来指定打开的文件的语言编码，它会在读 取的时候自动转换为内部unicode
bfile = codecs.open( "J:/C.java" , 'r', 'utf-8')  #
# bfile = open("dddd.txt", 'r')

ss = bfile.read()
bfile.close()
#  输出，这个时候看到的就是转换后的结果。如果使用语言内建的open函数 来打开文件，这里看到的必定是乱码
print(ss, type(ss))



'''
写入文件时，如果文件不存在，都会创建，不管是追加还是写入
'''
print('\n#======================写文件：python原生写文件方式--覆盖写入')
put_content_to_file('J:/python-write.txt', '\n哈哈哈---hello---123', 'utf-8');
s = get_content_from_file('J:/python-write.txt', 'utf-8')
print('写入后文件的内容是：', s)

print('\n#======================写文件：python原生写文件方式--追加写入')
append_content_to_file('J:/python-write.txt', '\n哈哈哈---hello---123', 'utf-8');
s = get_content_from_file('J:/python-write.txt', 'utf-8')
print('写入后文件的内容是：', s)


print('\n#======================StringIO 和 BytesIO')
'''
StringIO和BytesIO是操作内存中的对象，都提供了类似文件读写的接口，read，write等，
只不过初始化方式不同
'''
from io import StringIO
from io import BytesIO

print('\n#====StringIO写入')
f = StringIO()
len = f.write('hello')  #返回写入长度
print(f.getvalue())   #返回StringIO中的字符串

print('\n#====StringIO读取')
f = StringIO('Hello!\nHi!\nGoodbye!')
while True:
    s = f.readline()
    if s == '':
        break
    print(s.strip())


print('\n#====BytesIO写入')
f = BytesIO()
len = f.write('中文'.encode('utf-8')) #返回写入长度--6
print(f.getvalue())


print('\n#====BytesIO读取')
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
bs = f.read()
print(bs.decode('utf-8'))  #中文俩字

#
